package com.hatricks.base;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/**
 * @packageName: com.hatricks.base
 * @className: OverwriteAndOverload
 * @author: yanyuhui
 * @date: 2022/7/5 22:48
 * @description: 重写和重载
 */

public class OverrideAndOverload {


    public static void test1() {
        System.out.println("我的测试啥也没干");
    }

    public static void test1(String name) {
        System.out.printf("我的测试名称为:%s%n", name);
    }

    public static void test1(Integer age) {
        System.out.printf("我的测试的年龄为:%d%n", age);
    }

    public static void main(String[] args) {
        //重载, 既在编译完成就可以选定执行的目标方法 也就是在执行javac的时候就已经确认要执行的方法是那个方法了
        test1("你好");
        test1();
        test1(12);

        //重写 子类重写父类的方法  方法的形参为父类 但是执行的确实子类的方法,这种方式称之为动态链接（动态链接属于Java方法中的一种概念 每个方法都包含了 局部变量表 操作数栈 动态链接 和 返回地址值） PS (后面这部分可忽略在进阶时会讲到)
        sayHello(new Person("张三"));
        // 大学生 王五
        sayHello(new Student("王五"));
        // 这个时候重写就发生在子类覆盖了父类的同名同参数列表的方法,并且是在调用到p.say这个方法时,根据对象的不同,去寻找方法,来实现方法的动态调用
    }


    public static void sayHello(Person p) {
        p.say("你好哇");
    }

    @AllArgsConstructor
    @NoArgsConstructor
    public static class Person {
        protected String name;

        public void say(String content) {
            System.out.printf("我的名字叫:%s,我会讲方言:%s%n", name, content);
        }
    }

    @AllArgsConstructor
    public static class Student extends Person {

        public Student(String name) {
            super(name);
        }

        @Override
        public void say(String content) {
            super.say(content);
            System.out.printf("我叫%s,我还是一名学生,我还会用普通话的形式讲出这句话:%s%n", name, content);
        }
    }


}
